﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    
    public class RepositorioProcedimentoSituacaoTramite : IRepositorioProcedimentoSituacaoTramite
    {
        public ProcedimentoSituacaoTramite Inserir(ProcedimentoSituacaoTramite procedimentoSituacaoTramite)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(procedimentoSituacaoTramite);
            return procedimentoSituacaoTramite;
        }

        public ProcedimentoSituacaoTramite Atualizar(ProcedimentoSituacaoTramite procedimentoSituacaoTramite)
        {
            ProcedimentoSituacaoTramite tmpProcedimentoSituacaoTramite = ObterPorId(procedimentoSituacaoTramite.ProcedimentoSituacaoTramiteId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpProcedimentoSituacaoTramite.Codigo = procedimentoSituacaoTramite.Codigo;
            tmpProcedimentoSituacaoTramite.DataCadastro = procedimentoSituacaoTramite.DataCadastro;
            tmpProcedimentoSituacaoTramite.ProtocoloProcedimento = procedimentoSituacaoTramite.ProtocoloProcedimento;
            tmpProcedimentoSituacaoTramite.SituacaoTramite = procedimentoSituacaoTramite.SituacaoTramite;

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpProcedimentoSituacaoTramite);
            return tmpProcedimentoSituacaoTramite;
        }

        public void Excluir(ProcedimentoSituacaoTramite procedimentoSituacaoTramite)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(procedimentoSituacaoTramite);
        }

        public IList<ProcedimentoSituacaoTramite> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(ProcedimentoSituacaoTramite));
            return criteria.List<ProcedimentoSituacaoTramite>() as List<ProcedimentoSituacaoTramite>;
        }

        public ProcedimentoSituacaoTramite ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<ProcedimentoSituacaoTramite>(id);
        }

        public int ObterUltimoIdCodigoInteiro()
        {
            string[] literal = new string[] 
                {"a","b","c","d","e","f","g","h","i","j"
                ,"l","m","n","o","p","q","r","s","t","u","v","x","z","y"
                ,"w"};

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(ProcedimentoSituacaoTramite)).SetMaxResults(1);

            for (int i = 0; i <= literal.Length - 1; i++)
            {
                criteria.Add(Restrictions.Not(Restrictions.Like("Codigo", literal[i], MatchMode.Anywhere)));
            }

            criteria.AddOrder(Order.Desc("ProcedimentoSituacaoTramiteId"));


            ProcedimentoSituacaoTramite procedimentoSituacaoTramite = criteria.UniqueResult<ProcedimentoSituacaoTramite>();
            int ultimoCodigo = procedimentoSituacaoTramite != null ? procedimentoSituacaoTramite.ProcedimentoSituacaoTramiteId : 0;

            return ultimoCodigo;
        }

        public ProcedimentoSituacaoTramite ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(ProcedimentoSituacaoTramite))
                .Add(Restrictions.Eq("Codigo", codigo));

            return criteria.UniqueResult<ProcedimentoSituacaoTramite>() as ProcedimentoSituacaoTramite;
        }
    }
}